package gcp;

import gcp.enums.Sexo;

import java.io.Serializable;

/**
 * Usuario<br>
 * Entidade que representa um usuario do sistema.
 * @version 1.5 13/10/2009
 */
public class Usuario extends Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;

    private String senha, login;

    /**
     * Cria o objeto Pessoa.
     */
    public Usuario() {}

    /**
     * Cria o objeto Pessoa.
     * @param nome O nome do Usuario.
     * @param sobrenome O sobrenome do Usuario.
     * @param sexo O sexo do Usuario.
     * @param login O login do Usuario.
     * @param senha A senha do Usuario.
     * @throws Exception Lancada quando sobrenome ou nome ou login ou senha
     *             forem nulos ou vazios.
     */
    public Usuario(String nome, String sobrenome, Sexo sexo, String login,
            String senha) throws Exception {
        super(nome, sobrenome, sexo);
        if (login == null || login.isEmpty())
            throw new Exception("Login não pode ser nulo.");
        if (senha == null || senha.isEmpty())
            throw new Exception("Senha não pode ser nula.");
        this.login = login;
        this.senha = senha;
    }

    /**
     * Retorna o login do usuario.
     * @return login O login do usuario.
     */
    public String getLogin() {
        return login;
    }

    /**
     * Retorna a senha do usuario.
     * @return senha A senha do usuario.
     */
    public String getSenha() {
        return senha;
    }

    /**
     * Altera a senha do usuario para a passada como argumento.
     * @throws Exception Lancada caso o paramentro seja nulo ou vazio.
     */
    public void setSenha(String senhaAtual, String novaSenha) throws Exception {
        if (senhaAtual == getSenha()) {
            this.senha = novaSenha;
        } else {
            throw new Exception("Senha digitada errada.");
        }
    }

    /**
     * Verifica se Usuario eh igual ao objeto passado como parametro.
     * @param objeto - Objeto a ser comparado.
     * @return True, em caso de semelhanca, False caso contrario.
     */
    @Override
    public boolean equals(Object objeto) {
        if (!(objeto instanceof Usuario)) {
            return false;
        }
        Usuario outro = (Usuario) objeto;
        return super.equals(outro) && getLogin().equals(outro.getLogin());
    }

    /**
     * Atualiza a senha do Usuario para a passada como parametro.
     * @param senha A senha do Usuario a ser atualizada.
     */
    public void setSenha(String senha) {
        this.senha = senha;
    }

    /**
     * Atualiza o login do Usuario para o passado como parametro.
     * @param login O login do Usuario a ser atualizado.
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * Retorna um hashCode para Usuario.
     * @return hashCode HashCode para Usuario.
     */
    @Override
    public int hashCode() {
        int valor = 0;
        if (getNome() != null) {
            valor = super.hashCode() + getLogin().hashCode()
                    + getSenha().hashCode();
        }
        return valor;
    }
}